package com.th.coupon.common.vo;

import com.th.coupon.common.constant.PeriodType;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.StringUtils;

/**
 * 优惠卷规则对象
 * @author 涂航
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TemplateRule {

    /**
     * 过期规则
     */
    private Expiration expiration;
    /**
     * 折扣规则
     */
    private Discount discount;

    /**
     * 每个人最多领取多少张
     */
    private Integer limitation;

    /**
     * 使用范围限制 （地域+类型）
     */
    private Usage usage;

    /**
     * 权重（可以和哪些优惠卷叠加使用） 同一类的优惠卷一定不能叠加
     */
    private String weight;

    public Boolean validate(){
        //最简化效验
        return expiration.validate() &&
                discount.validate() &&
                usage.validate() &&
                limitation>0 &&
                StringUtils.isNotEmpty(weight);
    }

    /**
     * 有效期规则
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Expiration{

        /**
         * @{link PeriodType} 对应该枚举的code 有效期规则code
         */
        private Integer period;
        /**
         * 有效间隔 只对变动的有效期有效
         */
        private Integer gap;
        /**
         * 优惠卷模板的失效日期，两类规则都有效
         */
        private Long deadline;

        boolean validate(){
            //最简化效验
            return null != PeriodType.of(period) && gap > 0 && deadline > 0 ;
        }
    }

    /**
     * 折扣
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Discount{
        /**
         * 额度，满减（20） 折扣（85）立减（10）
         */
        private Integer quota;
        /**
         * 基准，需要满多少才可用
         */
        private Integer base;

        boolean validate(){
            return quota > 0 && base > 0;
        }
    }

    /**
     * 实验范围
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Usage{
        /**
         * 省份
         */
        private String province;
        /**
         * 城市
         */
        private String city;

        /**
         * 商品类型，list[文娱，生鲜，加居，全品类]
         */
        private String goodsType;

        boolean validate(){
            return StringUtils.isNotEmpty(province) &&
                    StringUtils.isNotEmpty(city) &&
                    StringUtils.isNotEmpty(goodsType);
        }
    }

}
